home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / asmutil / delbut2.zip / DELBUT2.ASM next >
Assembly Source File  |  1988-07-19  |  7KB  |  286 lines

  1. ;DELBUT revised to take a Path
  2. ;  DELBUT nonexistant-name  will delete NO files.   With some safety features
  3. ;  (say, /! on command line), it could work in .BAT files without the 'Y/N'
  4. ;  that makes DEL *.* useless.
  5. ; It can delete itself...
  6.  
  7.     PAGE    ,132
  8. S00000    SEGMENT BYTE PUBLIC 'code'
  9.     ASSUME    CS:S00000
  10.     ASSUME    SS:S00000
  11.     ASSUME    DS:S00000
  12.     ASSUME    ES:S00000
  13.  
  14. cr      equ    0Dh
  15. lf      equ    0Ah
  16. tab      equ    9
  17.  
  18. H00000    DB    256 DUP(?)
  19. P00100    PROC    NEAR
  20.  
  21.         JMP     Begin
  22.  
  23. Instrux       DB    cr,lf,'DELBUT v 2.0    '
  24.        DB    'by Scott Pakin 2/85, rewritten by J.E. Arkay 5/88',cr,lf
  25.        DB    cr,lf,cr,lf
  26.        DB    'Deletes all files in one directory EXCEPT '
  27.        DB    'those matching one filespec.',cr,lf,cr,lf
  28.        DB    'Syntax:     [d:][\path\]DELBUT [d:][\path\]filespec'
  29.        DB    cr,lf,cr,lf
  30.        DB    'Will not delete Hidden or Read-Only files.',cr,lf
  31.        DB    'Requires DOS 2.0 up.  Put it in your DOS directory.'
  32.        DB    cr,lf,cr,lf
  33.        DB    'Example for your RAM disk:'
  34.        DB    cr,lf,'To delete all except AutoCAD .OVL files,'
  35.        DB    cr,lf,cr,lf
  36.        DB    tab,'    DELBUT D:ACAD*.*'
  37. CrLf       DB    cr,lf,'$',1Ah
  38.  
  39. ParamMsg   DB    cr,lf,'DELBUT -- Invalid filespec',cr,lf,'$'
  40. NoFiles       DB    cr,lf,'DELBUT -- No files found',cr,lf,'$'
  41. NotFound   DB    cr,lf
  42.        DB    'DELBUT -- Filespec not found; no files deleted',cr,lf
  43.        DB    '( use DEL to delete all files )',cr,lf,'$'
  44. InvalidDrv DB    cr,lf,'DELBUT -- Invalid drive',cr,lf,'$'
  45. AllMatch   DB    cr,lf,'DELBUT -- All files match spec, none deleted',cr,lf,'$'
  46. Deleting   DB    'Deleting $'
  47. ParseMsg   DB    cr,lf,'DELBUT -- Error parsing filename',cr,lf,'$'
  48.  
  49. FoundFCB    DB    44 DUP(?)
  50. DTAtoStay    DB    44 DUP(0)
  51. DTAtoDelete    DB    44 DUP(?)
  52. CmdLineBuffer    DB    128 DUP(0)
  53. WildFilespec    DB    128 DUP(0)
  54. StarDotStar    DB    '*.*',0
  55. DeleteFlag    DB    0
  56. LastCharOffset    DW    0
  57. NameOffset    DW    0
  58.  
  59. Begin:
  60.     CLD
  61.     MOV    DX,offset DTAtoStay
  62.     MOV    AH,1AH            ;set DTA for DOS funcs 4Eh & 4Fh
  63.     INT    21H
  64.  
  65.     MOV    SI,80H
  66.     MOV    CL,[SI]            ;get Parameter length
  67.     OR    CL,CL            ;is it zero ?
  68.     JNZ    ChkParams
  69. ;display the instructions
  70.     MOV    DX,offset Instrux
  71.     JMP    SHORT ShoMsg
  72.  
  73. ChkParams:
  74. ;find valid characters in parameter area of PSP, and mov 'em to CmdLineBuffer
  75. ;Allowed are std filename chars, and \ ? * : and / for those who use it.
  76.     MOV    DI,offset CmdLineBuffer
  77.     INC    SI            ;to 1st char of params
  78.     XOR    CH,CH            ;now CX is length of params
  79. CharLoop:
  80.     MOV    AL,[SI]            ;get a character
  81.     CMP    AL,cr            ;is this one past the last char ?
  82.     JZ    FindFirst
  83.     CMP    AL,'!'
  84.     JZ    Movit
  85.     CMP    AL,' '            ;space
  86.     JZ    Skipit
  87.     Cmp    AL,tab
  88.     JZ    Skipit
  89.     CMP    AL,23h
  90.     JL    ParamsNFG
  91.     CMP    AL,2Ah            ; * allowed
  92.     JLE    Movit
  93.     CMP    AL,'-'
  94.     JZ    Movit
  95.     CMP    AL,2Eh            ; . and / allowed
  96.     JL    ParamsNFG
  97.     CMP    AL,':'
  98.     JLE    Movit
  99.     CMP    AL,'?'
  100.     JL    ParamsNFG
  101.     CMP    AL,'Z'
  102.     JLE    Movit
  103.     CMP    AL,'\'
  104.     JZ    Movit
  105.     CMP    AL,5Eh
  106.     JL    ParamsNFG
  107.     CMP    AL,7Ch
  108.     JZ    ParamsNFG
  109. Movit:    MOVSB
  110. NextChar:
  111.     LOOP    CharLoop
  112.     JMP    SHORT FindFirst
  113.  
  114. Skipit:
  115.     INC    SI
  116.     JMP    SHORT NextChar
  117. ;-------------------------------------
  118. FindFirst:
  119.     MOV    DX,offset CmdLineBuffer    ;holding Cmd Line as entered
  120.     DEC    DI            ;to last char moved
  121.     SUB    DI,DX            ;offset in DTA of last char
  122.     MOV    LastCharOffset,DI
  123.     XOR    CX,CX            ;normal files only
  124.     MOV    AH,4Eh            ;Find first matching file, to DTAtoStay
  125.     INT    21H
  126. ;Now DTAtoStay begins with the parsed command line drive & filename. If you
  127. ;entered DELBUT d:\test\*.12, it starts 04,'????????12 ',0.
  128. ;The found FNAME.EXT,0 is at 1Eh=30d in the DTA (no spaces, variable length)
  129.     JNC    ChkIfAnyFiles
  130.  
  131. ;likely errors
  132.     MOV    DX,offset NotFound    ;There are no files NOT to delete
  133. ShoMsg:    MOV    AH,9
  134.     INT    21H
  135.     MOV    AX,4C01h        ;exit w/Errorlevel = 1
  136.     INT    21h
  137.  
  138. ParamsNFG:
  139.     MOV    DX,offset ParamMsg
  140.     JMP    SHORT ShoMsg
  141.  
  142. ChkIfAnyFiles:
  143. ;copy CmdLineBuffer to get the path for WildFilespec
  144.     MOV    SI,offset CmdLineBuffer
  145.     MOV    DI,offset WildFilespec
  146.     MOV    CX,128            ;decimal
  147.     REP    MOVSB
  148.  
  149. ;Look backwards for the start of the filename.ext
  150. ;The char preceding the name will be a / or \ or : or we're at CmdLineBuffer
  151.     MOV    SI,offset WildFilespec
  152.     ADD    SI,LastCharOffset    ;point to last char of filespec
  153.     STD                ;go backwards
  154. LookLoop:
  155.     LODSB                ;DS:[SI] -> AL and DEC SI
  156.     CMP    SI,offset WildFilespec
  157.     JL    ReplaceName
  158.     INC    SI            ;'cause SI is 1 BELOW the '\'
  159.     CMP    AL,'\'
  160.     JZ    ReplaceName
  161.     CMP    AL,'/'
  162.     JZ    ReplaceName
  163.     CMP    AL,':'
  164.     JZ    ReplaceName
  165.     DEC    SI
  166.     JMP    SHORT LookLoop
  167.  
  168. ;make the name *.*
  169. ReplaceName:                ;SI points 1 before start of name.ext
  170.     CLD                ;go forwards
  171.     INC    SI            ;to start of name in WildFilespec
  172.     MOV    DI,SI
  173.     MOV    DX,offset WildFilespec
  174.     SUB    SI,DX
  175.     MOV    NameOffset,SI
  176.     MOV    SI,offset StarDotStar
  177.     MOV    CX,4
  178.     REP    MOVSB
  179.  
  180.     MOV    DX,offset DTAtoDelete
  181.     MOV    AH,1Ah            ;change DTA (was DTAtoStay)
  182.     INT    21h
  183.  
  184.     MOV    DX,offset WildFilespec
  185.     XOR    CX,CX            ;normal files only
  186.     MOV    AH,4Eh            ;find first match
  187.     INT    21h
  188.     JNC    EachFile
  189.     MOV    DX,offset NoFiles
  190.     JMP    ShoMsg
  191.  
  192. ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  193. ;Now delete any files in the directory that don't match the Filespec
  194. ; Start with Find First Match already called, found match in DTAtoDelete
  195.  
  196. ; Compare the found filename in DTAtoDelete with the parsed name in DTAtoStay
  197. ; Works like DOS (which is not, of course, the way you wish it would):
  198. ; DELBUT ?????.?? matches ABCDE.12 and ABCD.12 and ABC.1 but not ABCD.123
  199.  
  200. EachFile:                ;this is approx 0601 in the code
  201.     MOV    SI,offset DTAtoDelete+30 ;NAME.EXT,0 (variable length)
  202.     MOV    DI,offset FoundFCB
  203.     XOR    AL,AL            ;no special features
  204.     MOV    AH,29h            ;parse filename, no paths
  205.     INT    21h
  206.     CMP    AL,0FFh
  207.     JNZ    ParseOK
  208.     MOV    DX,offset ParseMsg
  209.     JMP    ShoMsg
  210. ParseOK:
  211.     MOV    SI,offset DTAtoStay+1    ;11-char parsed filename from cmd line
  212.     MOV    DI,offset FoundFCB+1    ;parsed found filename
  213.     MOV    CX,11
  214. MaskLoop:
  215.     LODSB                ;[SI] to AL & INC SI
  216.     CMP    AL,'?'
  217.     JNZ    NextOne
  218. ;a '?' has been found, copy it to the corresponding location
  219.     MOV    [DI],AL
  220. NextOne:
  221.     INC    DI
  222.     LOOP    MaskLoop
  223.  
  224. ;now compare the parsed name in FoundFCB
  225. Compare:
  226.     MOV    DI,offset DTAtoStay+1    ;11-char parsed filename from cmd line
  227.     MOV    SI,offset FoundFCB+1
  228.     Mov    CX,11
  229.     REPZ    CMPSB
  230.     JZ    ChkNLoop        ;spec matches, don't delete it
  231.  
  232. ;File does not match the command line filespec
  233.  
  234. ;copy the name.ext after the path for Delete (func 41h)
  235.     MOV    DI,offset CmdLineBuffer
  236.     ADD    DI,NameOffset
  237.     MOV    SI,offset DTAtoDelete+30 ;decimal, locn of ASCIIZ fname.ext
  238. FnameLoop:
  239.     MOV    AL,[SI]
  240.     MOVSB
  241.     OR    AL,AL
  242.     JZ    ShoName
  243.     JMP    SHORT FnameLoop
  244.  
  245. ShoName:
  246.     MOV    DX,offset Deleting
  247.     MOV    AH,9
  248.     INT    21H
  249.     MOV    SI,offset DTAtoDelete+30 ;decimal, locn of ASCIIZ fname.ext
  250.     CALL    DisplASCIIZ
  251.     MOV    DX,offset CmdLineBuffer    ;now name.ext is replaced
  252.     MOV    AH,41h            ;Delete File per ASCIIZ string
  253.     INT    21H
  254.     MOV    DeleteFlag,1        ;signal that something was deleted
  255. ChkNLoop:
  256.     MOV    AH,4Fh            ;Find Next (any), name to DTAtoDelete
  257.     INT    21H
  258.     JNC    EachFile        ;process this file if no errors
  259.  
  260.     CMP    DeleteFlag,1        ;was anything deleted ?
  261.     JZ    Exit            ;yes, no message
  262.     MOV    DX,offset AllMatch
  263.     JMP    ShoMsg            ;and exit w/Errorlevel=1
  264. Exit:
  265.     MOV    AX,4C00h        ;exit w/Errorlevel=0
  266.     INT    21H
  267. ;---------------------------------------------------------
  268. ;Display the ASCIIZ string pointed to by SI and do a CR,LF
  269. DisplASCIIZ:
  270.     LODSB
  271.     OR    AL,AL
  272.     JZ    DisplayDone
  273.     MOV    DL,AL
  274.     MOV    AH,2            ;Display Output 1 char
  275.     INT    21H
  276.     JMP    DisplASCIIZ
  277. DisplayDone:
  278.     MOV    DX,offset CrLf
  279.     MOV    AH,9
  280.     INT    21H
  281.     RET
  282.  
  283. P00100    ENDP
  284. S00000    ENDS
  285.     END    P00100
  286.